#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
    printf("process is running...\n");
    pid_t id  = fork();
    assert(id != -1);

    if(id == 0)
    {
        // 这里的替换，会影响父进程吗？？ 1 0 进程具有独立性
        // 类比：命令行怎么写，这里就怎么传
        sleep(1);
        // ./exec ls -a -l -> "./exec" "ls" "-a" "-l"
        execvp(argv[1], &argv[1]);
        //execl("/usr/bin/ls", "ls", "-a", "-l", "--color=auto", NULL);
        // 这里有两个ls, 重复吗？不重复，一个是告诉系统我要执行谁？一个是告诉系统，我想怎么执行
        //execlp("ls", "ls", "-a", "-l", "--color=auto", NULL);
        
        //char *const argv_[] = {
        //    "ls",
        //    "-a",
        //    "-l",
        //    "--color=auto",
        //    NULL
        //};

        ////execv("/usr/bin/ls", argv_);
        //execvp("ls", argv_);
        //execl("./mybin", "mybin", NULL);
        //execl("./mypy.py", "mypy.py", NULL);
        //execl("./myshell.sh", "myshell.sh", NULL);
        //char *const envp_[] = {
        //    (char*)"MYENV=11112222233334444",
        //    NULL
        //};
        //extern char **environ;
        ////execle("./mybin", "mybin", NULL, envp_); //自定义环境变量
        //putenv((char*)"MYENV=4443332211"); //将指定环境变量导入到系统中 environ指向的环境变量表
        //execle("./mybin", "mybin", NULL, environ); //实际上，默认环境变量你不传，子进程也能获取
        exit(1); //must failed
    }

    int status = 0;
    pid_t ret = waitpid(id, &status, 0);
    if(ret>0) printf("wait success: exit code: %d, sig: %d\n", (status>>8)&0xFF, status & 0x7F);





    //.c -> exe -> load -> process -> 运行 -> 执行我们现在所写的代码
    //printf("process is running...\n");

    //// load->exe
    //// 只要是一个函数，调用就有可能失败，就是没有替换成功，就是没有替换
    //// exec*为什么没有成功返回值呢？因为成功了，就和接下来的代码无关了，判断毫无意义
    //// execl 只要返回了，一定是错误了
    //execl("/usr/bin/ls"/*要执行哪一个程序*/,"ls","--color=auto", "-a", "-l", NULL/*你想怎么执行*/); // all exec* end of NULL
    //perror("ececl"); //打印错误原因
    ////execl("/usr/bin/top"/*要执行哪一个程序*/,"top", NULL/*你想怎么执行*/); // all exec* end of NULL

    //// 为什么这里的printf没有在执行了？？？printf也是代码，是在execl之后的，
    //// execl执行完毕的时候，代码已经全部被覆盖，开始执行新的程序的代码了，所以printf就无法执行了！
    //printf("process running done...\n");
    //exit(1);
}
